package br.edu.unipampa.personagem;

import br.edu.unipampa.cenario.Local;
import br.edu.unipampa.recurso.Agua;
import br.edu.unipampa.recurso.Cantil;
import br.edu.unipampa.recurso.Recurso;
import javax.swing.JOptionPane;

public class Mensageiro extends Pessoa {

    protected int forca;

    public int getForca() {
        if (forca < 0) {
            return 0;
        } else {

            return forca;
        }
    }

    public void setForca(int forca) {
        if ((forca) > 100) {
            this.forca = 100;

        } else if ((forca) < 0) {
            this.forca = 0;
        } else {
            this.forca = forca;

        }
    }

    public Mensageiro(int TamanhoBagagem, int modificadorDeCombate, int hpTotal) {
        this.forca = 100;
        this.setHpTotal(hpTotal);
        this.modificadorDeCombate = modificadorDeCombate;
        itens = new Recurso[TamanhoBagagem];
    }

    public String Comer(Local descanso) {
        if (descanso.getRecurso() != null) {
            setForca(getForca() + descanso.getRecurso().getEnergia());
            return "Voce achou alimento (" + descanso.getRecurso().getNome() + ") e comeu!";
        } else {
            return "Não há nenhum alimento para se alimentar";
        }
    }

    public String Dormir(Local descanso) {
        setForca(getForca() + 20);
        return "Você ganhou 20 de força dormindo";
    }

    public String Inventario() {
        String meusItens = "";
        for (int i = 0; i < this.getItens().length; i++) {
            if (this.getItens()[i] != null) {
                meusItens = meusItens + "\n|Codigo Item: " + i + " Item: " + this.getItens()[i].getNome();
            } else {
                meusItens = meusItens + "\n|Item: Espaço vazio no inventario";
            }
        }
        return meusItens;
    }

    public String ProcurarItens(Local local) {
        if (local.getRecurso() == null || !local.getRecurso().Disponivel()) {
            return "O Cenario " + local.getNome() + " não possui nenhum item necessario para sua jornada ou você já possui o item.";
        } else {
            if (local.getRecurso().getNome().equalsIgnoreCase("Agua")) {
                return "Utilize algum item para pegar a agua encontrada no local";
            } else {
                Pegar(local.getRecurso());
                return "++++++ Você achou e pegou o item " + local.getRecurso().getNome() + "+++++++++";
            }
        }
    }

    public void UsarItem(Recurso item) {
        item.setQuantidade(item.getQuantidade() - 1);
        if (item.getQuantidade() <= 0) {
            item = null;
        }
    }

    public String UsarItem(String codigoItem) {
        try {
            return getItens()[Integer.parseInt(codigoItem)].OpcoesItem();
        } catch (NullPointerException erro) {
            return "Digite o codigo de um item valido por favor";
        } catch (ArrayIndexOutOfBoundsException erro) {
            return "Digite o codigo de um item valido por favor";
        } catch (NumberFormatException erro) {
            return "Digite o codigo de um item valido por favor";
        }
    }

    public String UsarOpcoesItem(String codigoItem, String codigoOpcao, Mensageiro perso, Local localAtual) {
        try {
            return getItens()[Integer.parseInt(codigoItem)].UtilizaOpcao(Integer.parseInt(codigoOpcao), perso, localAtual);
        } catch (NullPointerException erro) {
            return "Digite o codigo de um item valido por favor";
        } catch (ArrayIndexOutOfBoundsException erro) {
            return "Digite o codigo de um item valido por favor";
        } catch (NumberFormatException erro) {
            return "Digite o codigo de um item valido por favor";
        }
    }

    public void Pegar(Recurso recurso) {
        for (int i = 0; i < this.getItens().length; i++) {
            if (this.getItens()[i] == null) {
                this.getItens()[i] = recurso;
                this.getItens()[i].setQuantidade(1);
                UsarItem(recurso);
                break;
            }
        }
    }

    public String VerificaForca() {
        String forca = "Força atual: ";
        for (int i = 0; i < getForca(); i++) {
            forca = forca + "|";
        }
        return forca;
    }

    public String Loot(Inimigo inimigo) {
        String retorno = "";
        int contador = 0;
        if (inimigo.isMorto()) {
            System.out.println(inimigo.hp);
            for (int i = 0; i < itens.length; i++) {

                if (itens[i] == null) {
                    for (int j = 0; j < inimigo.itens.length; j++) {
                        if (inimigo.itens[j] != null) {
                            itens[i] = inimigo.itens[j];
                            retorno = "Você pegou o item: " + inimigo.itens[j].getNome();

                            inimigo.itens[j] = null;
                            contador++;

                        } else if (contador == 0) {
                            retorno = "O inimigo não possui nenhum item que você possa utilizar";
                        }
                    }

                } else {
                    retorno = "Seu inventário está cheio!";
                }
            }


        } else {
            retorno = "Ação não é possível";
        }

        return retorno;

    }

    public void gameOver(Mensageiro mensageiro) {
        if (mensageiro.isMorto()) {
            System.out.println("GAME OVER");
            System.exit(0);
        }
    }

    public String getItensCombate() {
        int contador = 0;
        String retorno = "";
        for (int i = 0; i < getItens().length; i++) {

            if ((getItens()[i].getClass().getName().equalsIgnoreCase("br.edu.unipampa.recurso.ArmaDeDefesa")) || (getItens()[i].getClass().getName().equalsIgnoreCase("br.edu.unipampa.recurso.ArmaDeAtaque"))) {
                contador++;

            }

        }
        Recurso[] itensCombate = new Recurso[contador];

        for (int i = 0; i < getItens().length; i++) {

            if ((getItens()[i].getClass().getName().equalsIgnoreCase("br.edu.unipampa.recurso.ArmaDeDefesa")) || (getItens()[i].getClass().getName().equalsIgnoreCase("br.edu.unipampa.recurso.ArmaDeAtaque"))) {
                for (int j = 0; j < itensCombate.length; j++) {
                    if (itensCombate[j] == null) {
                        itensCombate[j] = getItens()[i];
                        System.out.println(itensCombate[j].getNome());
                        break;
                    }
                }
            }

        }

        for (int i = 0; i < itensCombate.length; i++) {
            retorno = retorno + "\n|Codigo Item: " + i + " Item: " + itensCombate[i].getNome();
        }

        return retorno;
    }
}
